/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package control;

import entidad.Bono;
import entidad.Cargo;
import entidad.Empleado;
import entidad.Falla;
import entidad.HoraExtra;
import entidad.Usuario;
import frontera.dao.DAO;
import java.util.Calendar;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 *
 * @author tuareg
 */
public class AdministrarEmpleados extends Administrar<Empleado> {

	@Override
	protected DAO<Empleado> getDAO() {
		return SIRHApp.getInstance().getDAOEmpleado();
	}

	public String crearEmpleado(String nombre, String cedula, String telefono, String direccion,
		String profesion, String estado, String porcentajeSalarioBas,
		Cargo cargoAsociado, String EPS, Calendar fechaDeCreacion, List<Falla> fallas) {

		String informacionValidacion = validarInformacion(nombre, cedula, telefono, direccion, profesion, porcentajeSalarioBas, EPS, cargoAsociado);

		if (informacionValidacion.equals("")) {
			Empleado nuevoEmpleado = new Empleado(nombre, cedula, Long.parseLong(telefono), direccion, profesion, estado,
				Float.valueOf(porcentajeSalarioBas), cargoAsociado, EPS, fechaDeCreacion);

			nuevoEmpleado.setFallas(fallas);
//			SIRHApp.getInstance().getAdmCambios().agregarEmpleado(nuevoEmpleado);
                        
			SIRHApp.getInstance().getSistema().agregarEmpleado(nuevoEmpleado);
                        
                        
                        for(Falla fa: nuevoEmpleado.getFallas()){
                            fa.setEmpAsociado(nuevoEmpleado);
                            SIRHApp.getInstance().getDAOFalla().crear(fa);
                        }
                        
			return "";
		}

		return informacionValidacion;
	}

	public String actualizarEmpleado(Empleado empleadoAntiguo, String nombre, String cedula, String telefono, String direccion,
		String profesion, String estado, String porcentajeSalarioBas,
		Cargo cargoAsociado, String EPS, List<HoraExtra> horasExtrasTemporales,
		List<Falla> fallasTemporales, List<Bono> bonosTemporales) {

		Empleado actEmpleado = empleadoAntiguo;
		String informacionValidacion = validarInformacion(nombre, cedula, telefono, direccion, profesion, porcentajeSalarioBas, EPS, cargoAsociado);
		
		if (informacionValidacion.equals("")) {

			Usuario usuarioEmpleado = new Usuario("", "", null);
			for (Usuario u : SIRHApp.getInstance().getSistema().getUsuarios()) {
				if (u.getEmpleadoAsociado().getNombre().equals(actEmpleado.getNombre())) {
					usuarioEmpleado = u;
				}
			}
                        
			String viejoEstado = actEmpleado.getEstado();
                        
                        Calendar fechaActual = Calendar.getInstance();
			Empleado nuevoEmpleado = new Empleado(nombre, cedula, Long.parseLong(telefono), direccion, profesion, 
                                                estado, Float.parseFloat(porcentajeSalarioBas), cargoAsociado, EPS, fechaActual);
			String tmp = validarEstado(viejoEstado, nuevoEmpleado);
			
                        if (!tmp.equals(""))
                            return tmp;

                        nuevoEmpleado.setBonos(bonosTemporales);
                        nuevoEmpleado.setHorasExtra(horasExtrasTemporales);
			nuevoEmpleado.setFallas(fallasTemporales);
                        usuarioEmpleado.setEmpleadoAsociado(nuevoEmpleado);
                        
                        getDAO().actualizar(actEmpleado, nuevoEmpleado);
                        
			return "";
		}

		return informacionValidacion;
	}
        
	public void agregarFalla(int indice, Falla falla) {
		Empleado actEmpleado = SIRHApp.getInstance().getSistema().getEmpleados().get(indice);
		actEmpleado.getFallas().add(falla);
	}

	public void eliminarFalla(int indiceEmpleado, String diaDelMes) {
		Empleado actEmpleado = SIRHApp.getInstance().getSistema().getEmpleados().get(indiceEmpleado);

		List<Falla> fallas = actEmpleado.getFallas();
		int size = fallas.size();
		for (int i = 0; i < size; i++) {
			if (fallas.get(i).getFecha().get(Calendar.DATE) == Integer.parseInt(diaDelMes)) {
				fallas.remove(fallas.get(i));
				break;
			}
		}

	}

	public void agregarHoraExtra(int indice, HoraExtra horaExtra) {
		Empleado actEmpleado = SIRHApp.getInstance().getSistema().getEmpleados().get(indice);
		actEmpleado.getHorasExtra().add(horaExtra);

	}

	public void eliminarHoraExtra(int indice, String diaDelMes) {
		Empleado actEmpleado = SIRHApp.getInstance().getSistema().getEmpleados().get(indice);

		List<HoraExtra> horasExtra = actEmpleado.getHorasExtra();
		int size = horasExtra.size();

		for (int i = 0; i < size; i++) {
			if (horasExtra.get(i).getFecha().get(Calendar.DATE) == Integer.parseInt(diaDelMes)) {
				horasExtra.remove(horasExtra.get(i));
				break;
			}
		}
	}

	public void agregarBono(int indice, Bono nuevoBono) {
		Empleado actEmpleado = SIRHApp.getInstance().getSistema().getEmpleados().get(indice);
		actEmpleado.getBonos().add(nuevoBono);
	}

	public void eliminarBono(int indice, Bono bono) {
		Empleado actEmpleado = SIRHApp.getInstance().getSistema().getEmpleados().get(indice);
		actEmpleado.getBonos().remove(bono);
	}

	private String validarEstado(String viejoEstado, Empleado nuevoEmpleado) {
		if (viejoEstado.equals("Despedido") && nuevoEmpleado.getEstado().equals("Activo")) {
			if (!nuevoEmpleado.getCargoAsociado().getEstado().equals("Ocupado") && !nuevoEmpleado.getCargoAsociado().getEstado().equals("En Proceso")) {
				return "El cargo asociado a este empleado esta Bloqueado, por favor cambie su estado a Ocupado o a En Proceso para cambiar el estado de este empleado";
			}
		}
		return "";
	}

	public String validarInformacion(String nombre, String cedula, String telefono, String direccion,
		String profesion, String porcentajeSalarioBas, String EPS, Cargo cargo) {

		if (!verificarLongitudNombre(nombre)) {
			return ("El nombre debe tener una longitud mínima de 10 caracteres y máxima de 40.");
		}

		if (!verificarFormatoNombre(nombre)) {
			return ("El nombre debe tener solo valores alfabéticos.");
		}

		if (!verificarLongitudCedula(cedula)) {
			return ("La cédula debe tener una longitud mínima de 7 dígitos y máxima de 15 dígitos.");
		}

		if (!verificarFormatoCedula(cedula)) {
			return ("La cédula debe ser un valor numérico.");
		}

		if (!verificarLongitudProfesion(profesion)) {
			return ("El nombre de la profesión debe tener una longitud mínima de 5 caracteres y máxima de 30.");
		}

                if ( !verificarFormatoProfesion(profesion)){
                    return ("La profesión debe tener solo valores alfabéticos.");
                }

		if (!verificarFormatoTelefono(telefono)) {
			return ("El teléfono debe ser un valor numérico.");
		}
		if (!verificarLongitudTelefono(telefono)) {
			return ("El teléfono debe tener una longitud mínima de 7 dígitos y máxima de 10.");
		}

		if (!verificarLongitudDireccion(direccion)) {
			return ("La dirección debe ser alfanumérica con una longitud mínima de 10 caracteres y máxima de 40.");
		}

		if (!verificarFormatoPorcSalarioBasico(porcentajeSalarioBas)) {
			return ("El porcentaje de salario básico debe tener solo valores numéricos.");
		}

		if (!verificarLongitudPorcSalarioBasico(porcentajeSalarioBas)) {
			return ("El porcentaje de salario básico debe ser un numero entre 0 y 200.");
		}

		if (cargo == null) {
			return ("Debe asociar un cargo a este empleado, para poder continuar.");
		}

		if (!verificarLongitudEPS(EPS)) {
			return ("El nombre de la EPS debe tener una longitud mínima de 5 caracteres y máxima de 25.");
		}

		if (!verificarFormatoEPS(EPS)) {
			return ("El nombre de la EPS debe contener únicamente valores alfabéticos.");
		}

		return ("");
	}

	public boolean verificarLongitudNombre(String nombre) {

		return (nombre.length() >= 10 && nombre.length() <= 40);
	}

	public boolean verificarFormatoNombre(String nombre) {
		Pattern patternNombre = Pattern.compile("[^A-Za-zñáéíóú ]");
		Matcher matcherNombre = patternNombre.matcher(nombre);

		boolean esCadena = false;
		while (matcherNombre.find()) {
			esCadena = true;
		}
		return !esCadena;
	}

	public boolean verificarLongitudCedula(String cedula) {
		boolean parse = true;

		if (!(cedula.length() >= 7 && cedula.length() <= 15)) {
			parse = false;
		}

		return parse;
	}

	public boolean verificarFormatoCedula(String cedula) {
		boolean parse = true;

		try {
			Long.parseLong(cedula);
		} catch (NumberFormatException NFE) {
			parse = false;
		}
		return parse;
	}

	public boolean verificarLongitudProfesion(String profesion) {

		return (profesion.length() >= 5 && profesion.length() <= 40);
	}

	public boolean verificarFormatoProfesion(String profesion) {
		Pattern patternNombre = Pattern.compile("[^A-Za-zñáéíóú ]");
		Matcher matcherNombre = patternNombre.matcher(profesion);

		boolean esCadena = false;
		while (matcherNombre.find()) {
			esCadena = true;
		}
		return !esCadena;
	}

	public boolean verificarLongitudTelefono(String telefono) {
		boolean parse = true;

		if (!(telefono.length() >= 7 && telefono.length() <= 10)) {
			parse = false;
		}

		return parse;
	}

	public boolean verificarFormatoTelefono(String telefono) {
		boolean parse = true;
		try {
			Long.parseLong(telefono);
		} catch (NumberFormatException NFE) {
			parse = false;
		}
		return parse;
	}

	public boolean verificarLongitudDireccion(String direccion) {
		return (direccion.length() >= 10 && direccion.length() <= 40);
	}

	public boolean verificarLongitudPorcSalarioBasico(String porcSalarioBasico) {
		boolean parse = true;

		float salario = Float.parseFloat(porcSalarioBasico);

		if (!(salario > 0 && salario < 200)) {
			parse = false;
		}

		return parse;
	}

	public boolean verificarFormatoPorcSalarioBasico(String porcSalarioBasico) {
		if (porcSalarioBasico.matches("(\\-)?\\d*\\.\\d*") || porcSalarioBasico.matches("(\\-)?\\d*")) {
			return true;
		}
		return false;
	}

	public boolean verificarLongitudEPS(String EPS) {

		return (EPS.length() >= 5 && EPS.length() <= 25);
	}

	public boolean verificarFormatoEPS(String EPS) {

		Pattern patternNombre = Pattern.compile("[^A-Za-zñáéíóú ]");
		Matcher matcherNombre = patternNombre.matcher(EPS);

		boolean esCadena = false;
		while (matcherNombre.find()) {
			esCadena = true;
		}

		return (!esCadena);
	}
}
